package com.kaige.asktaoplugin60.config;

import com.kaige.asktaoplugin60.handler.HeartbeatHandler;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.LengthFieldBasedFrameDecoder;
import io.netty.handler.codec.bytes.ByteArrayEncoder;

/**
 * TCP通道初始化类
 * 用于初始化SocketChannel，添加必要的编解码器和业务处理器
 */
public class TcpInitChannel extends ChannelInitializer<SocketChannel> {
    // 添加的handler，用于处理数据的解码和编码
    private final ChannelHandler channelHandler;

    // 最大帧长度为1MB
    private static final int MAX_FRAME_LENGTH = 1024 * 1024;
    // 长度字段偏移量，表示从第8个字节开始是长度字段
    private static final int LENGTH_FIELD_OFFSET = 8;
    // 长度字段占用2个字节，表示后续数据的长度
    private static final int LENGTH_FIELD_LENGTH = 2;

    /**
     * 构造函数
     * 
     * @param channelHandler Channel处理器，用于处理网络事件
     */
    public TcpInitChannel(ChannelHandler channelHandler) {
        this.channelHandler = channelHandler;
    }

    /**
     * 初始化方法
     * 
     * @param socketChannel Socket通道
     */
    @Override
    protected void initChannel(SocketChannel socketChannel) throws Exception {
        // 添加心跳检测
        socketChannel.pipeline().addLast("heartbeatHandler", new HeartbeatHandler(60, 30, 0));
        
        // 添加解码器，LengthFieldBasedFrameDecoder：帧解码器
        // 用于处理粘包和拆包问题
        socketChannel.pipeline().addLast("decoder", 
            new LengthFieldBasedFrameDecoder(MAX_FRAME_LENGTH, LENGTH_FIELD_OFFSET, LENGTH_FIELD_LENGTH));
        
        // 添加编码器，ByteArrayEncoder：字节数组编码器
        // 将Java的byte[]数组直接转换为Netty的ByteBuf进行网络传输
        socketChannel.pipeline().addLast("encoder", new ByteArrayEncoder());
        
        // 添加自定义的业务处理器
        socketChannel.pipeline().addLast(channelHandler);
    }
}